/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.colecoes;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 *
 * @author Bush
 */
public class TabelaDeSimbolos {

    private Map<String,String> tabelaSimbolos;
    public static TabelaDeSimbolos instancia;
    
    private void instaciarClasse(){
        tabelaSimbolos = new HashMap<>();
        cadastraPalavrasChave();
    }
    private TabelaDeSimbolos() {
        instaciarClasse();
    }
    
    public static TabelaDeSimbolos getIntancia(){
        if(instancia == null)
            instancia = new TabelaDeSimbolos();
        return instancia;
    }
    
    public void adicionaToken(String lexema,String token){
        if(!tabelaSimbolos.containsKey(lexema.toLowerCase()))
            tabelaSimbolos.put(lexema.toLowerCase(), token);
    }
    
    public void restauraTabelaSimbolos(){
        instaciarClasse();
    }
    
    public void removeLexema(String lexema){
        tabelaSimbolos.remove(lexema);
    }
    
    public boolean contemLexema(String lexema){
        if(tabelaSimbolos.containsKey(lexema))
            return true;
        else
            return false;                    
    }
    
    public int getIdLexema(String key){
        Set<String> chaves = tabelaSimbolos.keySet();  
        int id = -1;
        for (String chave : chaves)  {
            id ++;
            if(chave.equals(key)){
                return id; 
            }
        }
        return id;        
    }

    public Map<String, String> getTabelaSimbolos() {
        return tabelaSimbolos;
    }
    
    private void cadastraPalavrasChave(){
        adicionaToken("program","Tipo:Programa");
        adicionaToken("begin","Delimitador Inicio(begin)");
        adicionaToken("end","Delimitador Fim(end)");
        adicionaToken("const","Tipo: Declaração Constante");
        adicionaToken("var","Tipo: Declaração Variavel");
        adicionaToken("integer","Tipo Integer");
        adicionaToken("real","Tipo Real");
        adicionaToken("char","Tipo Char");
        adicionaToken("string","Tipo String");
        adicionaToken("procedure","Tipo: Declaração Procedimento");
        adicionaToken("function","Tipo: Declaração Funcao");
        adicionaToken("if","Instrução If");
        adicionaToken("then","Instrução Then");
        adicionaToken("else","Instrução Else");
        adicionaToken("while","Instrução While");
        adicionaToken("do","Instrução Do");
        adicionaToken("repeat","Instrução Repeat");
        adicionaToken("until","Instrução Until");
        adicionaToken("break","Instrução Break");
        adicionaToken("continue","Instrução Continue");
        adicionaToken("literal","Tipo Literal");
        adicionaToken("num","Tipo Num");
        adicionaToken("(","Delimitador Abre Parenteses");
        adicionaToken(")","Delimitador Fecha Parenteses");
        adicionaToken("\'","Delimitador Aspas");
        adicionaToken("e","Operador Lógico E");
        adicionaToken("ou","Operador Lógico OU");
        adicionaToken(":=","Operador Atribuição Dois Pontos Igual");
        adicionaToken("=","Operador Atribuição Igual");
        adicionaToken("==","Operador Comparação Igual");
        adicionaToken("<>","Operador Comparação Diferente");
        adicionaToken("<","Operador Comparação Menor");
        adicionaToken(">","Operador Comparação Maior");
        adicionaToken("<=","Operador Comparação Menor Igual");
        adicionaToken(">=","Operador Comparação Maior Igual");
        adicionaToken("+","Operador Aritmético Adição");
        adicionaToken("-","Operador Aritmético Subtração");
        adicionaToken("*","Operador Aritmético Multiplicação");
        adicionaToken("/","Operador Aritmético Divisão");
        adicionaToken(":","Separador Dois Pontos");
        adicionaToken(".","Delimitador Ponto Final");
        adicionaToken(";","Delimitador Ponto e Virgula");
        adicionaToken(",","Separador Vírgula");
    }
            
}
